/**
 * 新闻分类管理Hook模块
 * 
 * 本模块提供新闻分类数据的管理功能，包括：
 * - 获取分类列表（同时支持状态管理和React Query两种方式）
 * - 添加新分类
 * - 更新分类信息
 * - 删除分类
 * 
 * 通过这个Hook，组件可以轻松获取和操作分类数据，无需关心底层实现细节。
 * 同时使用了本地状态和React Query缓存，提供更好的用户体验和性能优化。
 * 
 * @module hooks/useCategories
 */
import { useState, useEffect, useCallback } from 'react';
import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query';
import { message } from 'antd';
import { 
  getCategories, 
  addCategory, 
  updateCategory, 
  deleteCategory 
} from '../api/categoryApi';
import { Category } from '../types';

/**
 * 分类Hook
 * 管理分类数据的获取和操作
 * 
 * @returns {Object} 包含分类数据和操作方法的对象
 */
export const useCategories = () => {
  // 本地状态管理分类数据和加载状态
  const [categories, setCategories] = useState<Category[]>([]);
  const [loading, setLoading] = useState<boolean>(false);
  
  /**
   * 获取分类列表
   * 手动获取数据并更新本地状态
   */
  const fetchCategories = useCallback(async () => {
    setLoading(true); // 设置加载状态为true
    try {
      const res = await getCategories(); // 调用API获取分类数据
      
      // 处理MongoDB返回数据结构，确保title属性正确映射
      const processedCategories = Array.isArray(res) ? res.map(item => {
        // 使用类型断言，安全访问可能的MongoDB文档结构
        const mongoDoc = item as { _doc?: { title: string } };
        if (mongoDoc._doc && mongoDoc._doc.title) {
          return {
            ...item,
            title: mongoDoc._doc.title
          };
        }
        return item;
      }) : [];
      
      // 添加类型断言确保返回类型是 Category[]
      setCategories(processedCategories as Category[]); // 更新本地状态
    } catch (error) {
      console.error('获取分类数据失败:', error); // 错误日志
      message.error('获取分类数据失败'); // 用户提示
    } finally {
      setLoading(false); // 无论成功失败，都结束加载状态
    }
  }, []);
  
  // 组件挂载时自动获取分类数据
  useEffect(() => {
    fetchCategories();
  }, [fetchCategories]);
  
  // 使用React Query获取分类数据（提供数据缓存和自动重新获取功能）
  const { data: categoriesData, isLoading, isError, error } = useQuery<Category[]>({
    queryKey: ['categories'], // 查询键，用于缓存标识
    queryFn: async () => {
      const data = await getCategories();
      
      // 处理MongoDB返回数据结构，确保title属性正确映射
      const processedCategories = Array.isArray(data) ? data.map(item => {
        // 使用类型断言，安全访问可能的MongoDB文档结构
        const mongoDoc = item as { _doc?: { title: string } };
        if (mongoDoc._doc && mongoDoc._doc.title) {
          return {
            ...item,
            title: mongoDoc._doc.title
          };
        }
        return item;
      }) : [];
      
      return processedCategories as Category[]; // 使用类型断言确保返回类型正确
    }
  });
  
  // 获取Query Client实例，用于操作缓存
  const queryClient = useQueryClient();
  
  /**
   * 更新分类Mutation
   * 处理分类信息更新操作
   */
  const updateMutation = useMutation({
    mutationFn: (data: {id: number | string; category: Partial<Category>}) => 
      updateCategory(data.id, data.category), // 调用API更新分类
    onSuccess: () => {
      message.success('分类更新成功'); // 成功提示
      queryClient.invalidateQueries({ queryKey: ['categories'] }); // 使缓存失效，触发重新获取
      fetchCategories(); // 手动刷新本地状态
    },
    onError: () => {
      message.error('分类更新失败'); // 错误提示
    }
  });
  
  /**
   * 删除分类Mutation
   * 处理分类删除操作
   */
  const deleteMutation = useMutation({
    mutationFn: (id: number | string) => deleteCategory(id), // 调用API删除分类
    onSuccess: () => {
      message.success('分类删除成功'); // 成功提示
      queryClient.invalidateQueries({ queryKey: ['categories'] }); // 使缓存失效
      fetchCategories(); // 手动刷新本地状态
    },
    onError: () => {
      message.error('分类删除失败'); // 错误提示
    }
  });
  
  /**
   * 添加分类Mutation
   * 处理新分类添加操作
   */
  const addMutation = useMutation({
    mutationFn: (category: Omit<Category, 'id'>) => addCategory(category), // 调用API添加分类
    onSuccess: () => {
      message.success('分类添加成功'); // 成功提示
      queryClient.invalidateQueries({ queryKey: ['categories'] }); // 使缓存失效
      fetchCategories(); // 手动刷新本地状态
    },
    onError: () => {
      message.error('分类添加失败'); // 错误提示
    }
  });
  
  // 返回分类数据和操作方法
  return {
    categories: categories || categoriesData || [], // 优先使用本地状态，然后是Query数据，最后是空数组
    loading: loading || isLoading, // 合并两种加载状态
    isLoading: loading || isLoading, // 为保持API一致性，提供isLoading作为loading的别名
    isError, // 错误标志
    error, // 错误详情
    updateCategory: updateMutation.mutate, // 更新分类方法
    deleteCategory: deleteMutation.mutate, // 删除分类方法
    addCategory: addMutation.mutate, // 添加分类方法
    refetch: fetchCategories // 手动刷新方法
  };
};

export default useCategories; // 默认导出 